//package com.joker.aigc.modules.chat.config;
//
//import com.alibaba.fastjson2.JSON;
//import com.alibaba.fastjson2.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.core.Message;
//import org.springframework.amqp.rabbit.connection.CorrelationData;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.PostConstruct;
//import java.util.concurrent.TimeUnit;
//
//@Component
//@Slf4j
//public class MQProducerAckConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {
//    @Autowired
//    private RabbitTemplate rabbitTemplate;
//    @Autowired
//    private RedisTemplate redisTemplate;
//    // 修饰一个非静态的void（）方法,在服务器加载Servlet的时候运行，
//    // 并且只会被服务器执行一次在构造函数之后执行，init（）方法之前执行。
//    @PostConstruct
//    public void init(){
//        rabbitTemplate.setConfirmCallback(this); //指定confirm
//        rabbitTemplate.setReturnCallback(this);  //指定return
//    }
//    //在消息到达交换机时执行
//    @Override
//    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//        //判断交换机是否成功接收到消息
//        if (ack){
//            log.info("消息发送成功"+ JSON.toJSONString(correlationData));
//        }else{
//            log.info("消息发送失败"+JSON.toJSONString(cause));
//            //如果没有到达交换机，调用重试方法
//            this.retryMsg(correlationData);
//        }
//    }
//
//
//    //在消息没有到达队列时执行
//    @Override
//    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
//        // 反序列化对象输出
//        log.info("消息主体: " + new String(message.getBody()));
//        log.info("应答码: " + replyCode);
//        log.info("描述：" + replyText);
//        log.info("消息使用的交换器 exchange : " + exchange);
//        log.info("消息使用的路由键 routing : " + routingKey);
//        //获取到correlationDataId
//        String correlationDataId = (String) message.getMessageProperties().getHeaders().get("spring_returned_message_correlation");
//        //从redis中取到gmallCorrelationData对象，调用重试方法
//        String strJSON = (String) redisTemplate.opsForValue().get(correlationDataId);
//        GmallCorrelationData gmallCorrelationData = JSONObject.parseObject(strJSON, GmallCorrelationData.class);
//        this.retryMsg(gmallCorrelationData);
//
//    }
//    //重试方法
//    private void retryMsg(CorrelationData correlationData) {
//       GmallCorrelationData gmallCorrelationData=(GmallCorrelationData) correlationData;
//
//       //获取重试次数
//        int retryCount = gmallCorrelationData.getRetryCount();
//        //如果重试次数已经超过三次就不再重试了
//        if (retryCount>=3){
//            log.error("重试次数已到，发送消息失败"+gmallCorrelationData);
//        }else{
//            retryCount++;
//            gmallCorrelationData.setRetryCount(retryCount);
//            log.info("重试次数：\t"+(retryCount));
//            //更新缓存里的数据 因为重试次数改变了
//           redisTemplate.opsForValue().set(gmallCorrelationData.getId(), JSONObject.toJSONString(gmallCorrelationData),10, TimeUnit.MINUTES);
//           //重新发送消息
//            rabbitTemplate.convertAndSend(gmallCorrelationData.getExchange(),gmallCorrelationData.getRoutingKey(),gmallCorrelationData.getMessage(),gmallCorrelationData);
//        }
//    }
//
//}
//
